﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace KylinORM.Message
{
    /// <summary>
    /// 消息访问接口的提供者类型
    /// </summary>
    public enum EMessageProviderType
    {
        /// <summary>
        /// 使用系统内存管理消息
        /// </summary>
        System,
        /// <summary>
        /// 使用Redis服务器管理消息
        /// </summary>
        Redis,
        /// <summary>
        /// 暂不支持
        /// </summary>
        Memcache
    }

    /// <summary>
    /// 消息访问接口
    /// </summary>
    public interface IMessageProvider
    {
        /// <summary>
        /// 连接字符串
        /// </summary>
        MessageServerConnectionString ConnectionString { get; }
        /// <summary>
        /// 服务器类型
        /// </summary>
        EMessageProviderType ProviderType { get; }

        /// <summary>
        /// 将 key 的值设为 value
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="value"></param>
        void Set<T>(string key, T value);
        /// <summary>
        /// 将 key 的值设为 value ，当且仅当 key 不存在。若给定的 key 已经存在，则 SETNX 不做任何动作。
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        bool SetNX<T>(string key, T value);
        /// <summary>
        /// 返回 key 所关联的值，如果 key 不存在那么返回NULL
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        T Get<T>(string key);
        /// <summary>
        /// 为给定 key 设置生存时间，当 key 过期时，它会被自动删除
        /// </summary>
        /// <param name="key"></param>
        /// <param name="timeout"></param>
        void Expire(string key, TimeSpan timeout);
        /// <summary>
        /// 删除给定的一个或多个 key 
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        bool Del(string key);
    }
}
